<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        /*
            总结：
            1. 类的实例不是必须写的，需要对类进行初始化操作，如添加指定属性时才写
            2. 子类继承父类，子类中写了构造器，那么子类构造器中的super是必须要调用的
            3. 类中定义的方法都是放在了类的原型对象上，供实例去使用
        */
        class Persion {
            // 构造器方法
            constructor(name,age) {
                // 构造器中的this指向类的实例对象（constructor是一个函数，由实例对象调用，所以this指向实例对象）
                this.name = name
                this.age = age
            }
            // 一般方法
            speak() {
                // 放在了类的原型对象上，供实例使用
                // 通过Persion实例调用speak方法时，speak中的this指向Person实例
                console.log(`我的名字叫${this.name},今年${this.age}岁了`);
            }
        }
        // Student类继承与Persion类
        class Student extends Persion {
            constructor(name,age,id) {
                super(name,age)
                this.id = id
                this.school = "bilibili"
            }
            // 重写从父类继承的方法
            speak() {
                console.log(`我的名字叫${this.name},今年${this.age}岁了,编号为${this.id}`);
            }
        }
        const p1 = new Persion('张三',18)
        p1.speak()
        const s1 = new Student('李四',16,'30461')
        s1.speak()

        class Car {
            constructor(name,price) {
                this.name = name
                this.price = price
                // this.made = 'china'
            }
            // 类中的赋值语句，如下代码是给Car的实例对象添加属性，属性名为a，值为1，如果需要加给类本身，见下
            a = 1
            /*
                函数对象的属性属于函数对象，并不属于实例对象，           
                对于这样的属性，我们称为静态成员，属于类而不属于实例对象
            */ 
            static demo = '静态成员'
            static demo = {}

        }
        const c1 = new Car('奔驰c63',1999)
        console.log(c1);
    </script>
</body>
</html>